import torch
import torch.nn.functional as F


y = torch.tensor([1.0])  # true label
x1 = torch.tensor([1.1]) # input feature
w1 = torch.tensor([2.2]) # weight parameter
b = torch.tensor([0.0]) # bias unit

z = x1 * w1 + b # net input

"""
torch.sigmoid() 是一个常用的激活函数，用于将输入张量的值映射到 (0, 1) 区间。它在二分类问题、神经网络层之间的非线性转换等场景中被广泛使用。
                1
sigmoid(z) = --------
             1 + exp(-z)
             
输入可以是任意实数（-∞ 到 +∞）
输出范围严格在 (0, 1) 之间
函数呈 S 形曲线，在 x=0 处的输出为 0.5
导数特性：sigmoid′(x)=sigmoid(x)⋅(1−sigmoid(x))，这对反向传播很有用
"""
a = torch.sigmoid(z) # activation & output

'''
computation graph:

w1 --+
     |
     |
     × --> u = w1 × x1 --> + --> z = u + b --> a=∂(z) --> loss = L(a, y)
    /|\
     |
x1 --+
'''

"""
binary_cross_entropy:
用于计算二元交叉熵损失的函数，主要用于二分类问题的模型训练。它衡量的是模型输出的概率分布与真实标签之间的差异。
二元交叉熵（Binary Cross Entropy, BCE）的数学公式为：
loss(x,y)=−y⋅log(σ(x))−(1−y)⋅log(1−σ(x))
其中：
y 是真实标签（取值为 0 或 1）
x 是模型的原始输出（未经过激活函数）
σ(x) 是 sigmoid 函数的输出（将 x 映射到 (0, 1)，表示预测为正类的概率）
"""
loss = F.binary_cross_entropy(a, y)
print("a: ", a, " y: ", y, " loss:", loss)